package cn.iocoder.yudao.module.energy.dal.mysql.data;

import java.util.*;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.energy.dal.dataobject.data.DataDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.energy.controller.admin.data.vo.*;

/**
 * 能耗数据 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface DataMapper extends BaseMapperX<DataDO> {

    default PageResult<DataDO> selectPage(DataPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<DataDO>()
                .eqIfPresent(DataDO::getDeviceId, reqVO.getDeviceId())
                .likeIfPresent(DataDO::getDeviceName, reqVO.getDeviceName())
                .eqIfPresent(DataDO::getTimestamp, reqVO.getTimestamp())
                .eqIfPresent(DataDO::getVoltage, reqVO.getVoltage())
                .eqIfPresent(DataDO::getCurrents, reqVO.getCurrents())
                .eqIfPresent(DataDO::getActivePower, reqVO.getActivePower())
                .eqIfPresent(DataDO::getEnergyConsumption, reqVO.getEnergyConsumption())
                .eqIfPresent(DataDO::getTemperature, reqVO.getTemperature())
                .eqIfPresent(DataDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(DataDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(DataDO::getId));
    }

    default DataDO selectByDeviceId(String deviceId) {
        return selectOne(new LambdaQueryWrapperX<DataDO>()
                .eq(DataDO::getDeviceId, deviceId)
                .orderByDesc(DataDO::getId)
                .last("LIMIT 1")); // 获取最新的一条记录
    }

    default List<DataDO> selectLatestByDeviceIds(Collection<String> deviceIds) {
        if (deviceIds == null || deviceIds.isEmpty()) {
            return Collections.emptyList();
        }
        
        // 获取每个设备最新的数据
        // 注意：实际实现可能需要更复杂的SQL来确保只获取每个设备的最新记录
        return selectList(new LambdaQueryWrapperX<DataDO>()
                .in(DataDO::getDeviceId, deviceIds));
    }

    default List<DataDO> selectList() {
        return selectList(new LambdaQueryWrapperX<DataDO>()
                .orderByDesc(DataDO::getId));
    }

}